package br.com.leopard.erp.gym.mapeamento.base_sistema;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.leopard.erp.gym.persist.modify.Modificar;
import br.com.leopard.erp.gym.persist.modify.ModificarFactory;
import br.com.leopard.erp.gym.persist.modify.TipoModificacaoData;
import br.com.leopard.util.annotations.UpperCase;

@MappedSuperclass
@UpperCase
public abstract class AbstractPersistenceClass implements Serializable {

	private static final long serialVersionUID = 1L;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_CADASTRO", nullable = false)
	private Date dataCadastro;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_ATUALIZACAO")
	private Date dataAtualizacao;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_ATIVACAO")
	private Date dataAtivacao;

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "DATA_INATIVACAO")
	private Date dataInativacao;

	@Column(name = "ATIVO", nullable = true)
	private Boolean ativo;

	@PrePersist
	private final void prePersist() {
		atualizarInformacoes();
	}

	@PreUpdate
	private final void preUpdate() {
		atualizarInformacoes();
	}

	private void atualizarInformacoes() {
		if (ativo == null) {
			ativo = false;
		}

		Modificar modificacao = ModificarFactory.getInstance().getModificarData(TipoModificacaoData.ATIVACAO);
		modificacao.modificarData(this);

		modificacao = ModificarFactory.getInstance().getModificarData(TipoModificacaoData.PERSISTENCE);
		modificacao.modificarData(this);
	}

	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	public Date getDataAtualizacao() {
		return dataAtualizacao;
	}

	public void setDataAtualizacao(Date dataAtualizacao) {
		this.dataAtualizacao = dataAtualizacao;
	}

	public Date getDataAtivacao() {
		return dataAtivacao;
	}

	public void setDataAtivacao(Date dataAtivacao) {
		this.dataAtivacao = dataAtivacao;
	}

	public Date getDataInativacao() {
		return dataInativacao;
	}

	public void setDataInativacao(Date dataInativacao) {
		this.dataInativacao = dataInativacao;
	}

	public Boolean getAtivo() {
		return ativo;
	}

	public void setAtivo(Boolean ativo) {
		this.ativo = ativo;
	}

}
